80277ee0: 3c 01 1f ff  LUI at, 0x1fff
80277ee4: 34 21 ff ff  ORI at, at, 0xffff      ;at = 1fffffff
80277ee8: 00 a1 70 24  AND t6, a1, at          ;t6 = a1 & at
80277eec: 3c 01 80 34  LUI at, 0x8034          ;at = 0x80340000
80277ef0: 00 04 78 80  SLL t7, a0, 0x2         ;t7 = a0 * 4
80277ef4: 00 2f 08 21  ADDU at, at, t7         ;at += t7
80277ef8: ac 2e b4 00  SW t6, at, 0xffffb400   ;*(at + 0xffffb400) = t6

80277efc: 00 04 c0 80  SLL t8, a0, 0x2         ;t8 = a0 * 4
80277f00: 3c 02 80 34  LUI v0, 0x8034 
80277f04: 00 58 10 21  ADDU v0, v0, t8         ;v0 = 0x80340000 + t8
80277f08: 03 e0 00 08  JR ra
80277f0c: 8c 42 b4 00  LW v0, v0, 0xffffb400   ;v0 = *(v0 + 0xffffb400);

/* 0x80277ee0 */
uint32 set_segment_base(int segment, void *base)
{
    segment_table[segment] = base & 0x1fffffff;
    return segment_table[segment];
}


80277f20: 00 04 70 80  SLL t6, a0, 0x2 (2)
80277f24: 3c 02 80 34  LUI v0, 0x8034 (32820)
80277f28: 00 4e 10 21  ADDU v0, v0, t6
80277f2c: 8c 42 b4 00  LW v0, v0, 0xffffb400 (-19456)
80277f30: 3c 01 80 00  LUI at, 0x8000 (32768)
80277f34: 00 41 78 25  OR t7, v0, at
80277f38: 03 e0 00 08  JR ra                           ;return  *((a0<<2)+0x8033b400) | 0x8000000
80277f3c: 01 e0 10 25  OR v0, t7, r0


long segment_table[]; /* 0x8033b400 */

/* 0x80277f20 */
void * get_segment_base(int segment)
{
    return (segment_table[segment] | 0x8000000);
}


80277f50: 27 bd ff f8  ADDIU sp, sp, 0xfffffff8 (-8)
80277f54: 00 04 76 02  SRL t6, a0, 0x18 (24)
80277f58: af ae 00 04  SW t6, sp, 0x4 (4)              ;[sp + 0x4] = a0 >> 0x18

80277f5c: 3c 01 00 ff  LUI at, 0xff (255)
80277f60: 34 21 ff ff  ORI at, at, 0xffff (65535)
80277f64: 00 81 78 24  AND t7, a0, at
80277f68: af af 00 00  SW t7, sp, 0x0 (0)              ;[sp + 0x0] = a0 | 0x00ffffff

80277f6c: 8f b8 00 04  LW t8, sp, 0x4 (4)              ;t8 = [sp + 0x4];
80277f70: 3c 08 80 34  LUI t0, 0x8034 (32820)          ;t0 = 0x80340000;
80277f74: 8f a9 00 00  LW t1, sp, 0x0 (0)              ;t1 = [sp + 0x0];
80277f78: 00 18 c8 80  SLL t9, t8, 0x2 (2)             ;t9 = t8 << 2;            t9 = [sp + 0x04] << 2
80277f7c: 01 19 40 21  ADDU t0, t0, t9                 ;t0 += t9;                t0 = 0x80340000 + ([sp + 0x04] << 2)
80277f80: 8d 08 b4 00  LW t0, t0, 0xffffb400 (-19456)  ;t0 = *(t0 + 0xffffb400); t0 = *(0x80340000 + ([sp + 0x04] << 2) + 0xffffb400)
80277f84: 3c 01 80 00  LUI at, 0x8000 (32768)          ;at = 0x80000000;
80277f88: 01 09 10 21  ADDU v0, t0, t1                 ;v0 = t0 + t1;            v0 = *(0x8033b400 + [sp + 0x4]) + [sp + 0x0]
80277f8c: 00 41 50 25  OR t2, v0, at                   ;t2 = v0 | at;            t2 = *(0x8033b400 + [sp + 0x4]) | 0x80000000
80277f90: 10 00 00 03  BEQ r0, r0, 0x80277f9c(pc + 0xc)
80277f94: 01 40 10 25  OR v0, t2, r0                   ;v0 = t2
80277f98: 10 00 00 01  BEQ r0, r0, 0x80277f9c(pc + 0x4)
80277f9c: 00 00 00 00  NOP
80277fa0: 03 e0 00 08  JR ra

[sp + 0x4]   seg
[sp + 0x0]   off

/* 0x80277f50 */
void * segmented_to_virtual(uint32 addr)
{
    seg = addr >> 24;
    off = addr & 0x00ffffff;

    return (segment_table[seg] + off) | 0x8000000;
}





/--- DECOMPIED CODE ---/

/* GLOBALS */

uint32 segment_table[]; /* 0x8033b400 */


/* FUNCTIONS */

/* 0x80277ee0 */
uint32 set_segment_base(int segment, void *base)
{
    segment_table[segment] = base & 0x1fffffff;
    return segment_table[segment];
}

/* 0x80277f20 */
void * get_segment_base(int segment)
{
    return (segment_table[segment] | 0x8000000);
}

/* 0x80277f50 */
void * segmented_to_virtual(uint32 addr)
{
    seg = addr >> 24;
    off = addr & 0x00ffffff;

    return (segment_table[seg] + off) | 0x8000000;
}

